package com.itheima.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckGroupDao;
import com.itheima.dao.CheckItemDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.exception.CheckGroupException;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;


import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Service(interfaceClass = CheckGroupService.class)
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {


    @Autowired
    private CheckGroupDao checkGroupDao;

    @Autowired
    private CheckItemDao checkItemDao;



    // 1.2   抽取出来
    public void setcheckGroupIdAndCheckitemIds(Integer checkGroupId, List<Integer> checkitemIds){
        /*
          1.2 遍历循环之前 先判断是否检查项为空
                if (CollectionUtil.isNotEmpty(checkitemIds)){
                    // 遍历循环 检查组勾选的id （1.2.3）  与检查组信息主键 组合 （5-1）（5-2）（5-3）
                        for (Integer checkitemId : checkitemIds) {
                            checkGroupDao.setIdAndCheckitemIds(checkGroupId,checkitemId);
                              }*/
        //1.2 对检查组 进行优化       方法 后抽取出来   编辑后重建建立联系 配对

        //需要判断 检查项 是否为空
        if (CollectionUtil.isNotEmpty(checkitemIds)){
            checkGroupDao.setcheckGroupIdAndCheckitemIds(checkGroupId,checkitemIds);
        }

    }



    //1. 检查组添加
        @Override
        public void add(CheckGroup checkGroup) {
            //1.1先插入 检查组的基本信息 并返回基本信息的主键
                checkGroupDao.add(checkGroup);  //这个保存完    checkGroup 里面就存在值了
                //获取 主键id
                    Integer checkGroupId = checkGroup.getId();
                //获取 检查项id
                    List<Integer> checkitemIds = checkGroup.getCheckitemIds();

                    /*
          1.2 遍历循环之前 先判断是否检查项为空
                if (CollectionUtil.isNotEmpty(checkitemIds)){
                    // 遍历循环 检查组勾选的id （1.2.3）  与检查组信息主键 组合 （5-1）（5-2）（5-3）
                        for (Integer checkitemId : checkitemIds) {
                            checkGroupDao.setIdAndCheckitemIds(checkGroupId,checkitemId);
                              }
            //1.2 对检查组 进行优化       方法 后抽取出来   编辑后重建建立联系 配对
            checkGroupDao.setcheckGroupIdAndCheckitemIds(checkGroupId,checkitemIds);
                  */
                    setcheckGroupIdAndCheckitemIds(checkGroupId,checkitemIds);

    }







    // 2. 根据 搜索内容 进行分页的查询
            @Override
            public PageResult findPage(QueryPageBean queryPageBean) {
                //2.1 分页操作
                Page page = PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());

                //2.2 第二部  做一个简单的查询sql  跟分页没关系    查询出来的是CheckGroup信息
                List<CheckGroup> checkGroups = checkGroupDao.findPage(queryPageBean.getQueryString());

                return new PageResult(page.getTotal(),checkGroups);
            }




    //3. 编辑
         // 3.1 编辑前 查询数据 进行数据回显
                @Override
                public Map findById4Edit(Integer id) {
                        Map map = new HashMap();

                    //查询 检查组基本信息
                    CheckGroup checkGroup = checkGroupDao.findById(id);


                    //查询检查组 所有检查项
                     List<CheckItem> checkItems =  checkItemDao.findAllSins();

                    // 查询 检查组 已经选中的 检查项
                    List<Integer> checkItemIds = checkGroupDao.findAllCheckGroupByIdAndCheckItemID(id);

                    map.put("checkGroup",checkGroup);
                    map.put("checkItems",checkItems);
                    map.put("checkItemIds",checkItemIds);

                    return map;
                }


            //3.2 编辑数据
                    @Override
                    public void edit2(CheckGroup checkGroup) {
                        //根据 id 来编辑 基本信息
                        checkGroupDao.edit(checkGroup);
                        //删除原来的 配对关系
                        checkGroupDao.deleteAssociation(checkGroup.getId());
                        //建立新的配对关系
                        setcheckGroupIdAndCheckitemIds(checkGroup.getId(),checkGroup.getCheckitemIds());
                    }


            //4. 删除检查组
                    @Override
                    public void delete2(Integer id) throws CheckGroupException {

                            //先进行 查询  查询 检查组 是否被引用
                        Integer count = checkGroupDao.findDelete(id);

                        // 根据查询结果    判断 是否存在 引用  则不能删除
                            if (count>0){
                                throw new CheckGroupException("检查组存在引用不能删除");
                            }else {
                                checkGroupDao.delete2(id);
                            }

                    }
            // 5. 查询所有检查组
                    @Override
                    public List<CheckGroup> findAllCheckGroup() {
                      return   checkGroupDao.findAllCheckGroup();
                    }


}





